package com.zjj.wangluo.lianxi.tcp01;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author zhoujunjie
 * @desc TODO
 * @date
 *
 * TCP ==> Transfer Control Protocol ==> 传输控制协议
 * TCP协议的特点
 *     * 面向连接的协议
 *     * 只能由客户端主动发送数据给服务器端，服务器端接收到数据之后，可以给客户端响应数据。
 *     * 通过三次握手建立连接，连接成功形成数据传输通道。
 *     * 通过四次挥手断开连接
 *     * 基于IO流进行数据传输
 *     * 传输数据大小没有限制
 *     * 因为面向连接的协议，速度慢，但是是可靠的协议。
 *
 * TCP协议的使用场景
 *     * 文件上传和下载
 *     * 邮件发送和接收
 *     * 远程登录
 *
 * TCP协议相关的类
 *     * Socket
 *         * 一个该类的对象就代表一个客户端程序。
 *     * ServerSocket
 *         * 一个该类的对象就代表一个服务器端程序。
 *
 * Socket类构造方法
 *     * Socket(String host, int port)
 *         * 根据ip地址字符串和端口号创建客户端Socket对象
 *         * 注意事项：只要执行该方法，就会立即连接指定的服务器程序，如果连接不成功，则会抛出异常。
 *             如果连接成功，则表示三次握手通过。
 *
 * Socket类常用方法
 *     * OutputStream getOutputStream(); 获得字节输出流对象
 *     * InputStream getInputStream();获得字节输入流对象
 *
 * 需求1：客户端与服务端可以建立连接 ； 服务端接收一条消息，客户端发送一条消息
 */
public class TCPServer {

    public static void main(String[] args) {
        System.out.println("------------服务器--------------");
        ServerSocket ss = null;
        Socket socket = null;
        InputStream is = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        try {
            //1.创建服务器
            ss = new ServerSocket(8888);
            //2.等待客户端接入 阻塞点
            socket = ss.accept();
            System.out.println("客户端已成功接入~");
            //3.服务端 读取消息
            is = socket.getInputStream();
            isr = new InputStreamReader(is);
            br = new BufferedReader(isr);
            String str = br.readLine();
            System.out.println("服务器端读到消息："+str);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ss != null) {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (is != null) {
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (isr != null) {
                    try {
                        isr.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (br != null) {
                    try {
                        br.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
